import java.util.*;
/*API是容器提供的函数等接口，用于让外部代码与容器进行交互。
 * 集合是容器的一种特殊类型，主要用于存储和操作一组对象，有特定的接口和实现类
 * 用来存储和管理其他对象的对象，即对象的容器
 * 如List、Set、Map等，侧重于对元素的管理和操作
 * 而容器是一个更宽泛的概念，除了集合外，还包括数组等其他用于存储数据的结构
 * 此外，一些第三方库中可能也会有自定义的容器类型，但不一定遵循Java集合框架的规范
 * */
/*集合分成两大类：
* 1.collection单列集合，一次只能存放一个元素,
* 2.map双列集合，一次存放一对元素（键值对）
*
*  接口        接口       实现类
*                       ArrayList
*             List      LinkedList
*                       Vector(市场淘汰)
*                       Stack和queue(不常提起这两个)
* Collection
*              Set      HashSet    LinkedHashSet
*                       TreeSet
*
* List添加的元素是有序的，可重复的，有索引
* Set添加的元素是无序的，不可重复的，没有索引
*(本次会把除了vector和stack和queue外其他集合都学完)
*
*
* 使用场景总结：
* 1.如果想要集合元素可重复，用ArrayList
* 2.如果想要集合元素可重复，而且增删操作多与查询，用LinkedList
* 3.如果集合中元素去重，用HashSet
* 4.如果想要集合元素可重复，而且保证存取顺序，用LinkedHashSet
* 5.如果想要集合元素排序，用TreeSet
* */
public class collection {
    public static void main(String[] args) {
     /*collection接口的常用方法：(子都能用)
     * 1.add() 添加元素
     * 2.remove() 删除元素
     * 3.clear() 清空元素
     * 4.contains() 判断是否包含某个元素
     * 5.isEmpty() 判断是否为空
     * 6.size() 返回集合的长度
     * 7.iterator() 返回迭代器
     * */
        System.out.println("collection接口的常用方法：");
        //1.创建集合
        // (collection是接口，不能实例化，只能通过实现类实例化)
        // (这里用ArrayList多态实现看看,后续使用直接定义ArrayList c = new ArrayList<>();就行)
        Collection<String> c = new ArrayList<>();
        //2.添加元素
        //add()方法成功添加元素自己返回true，失败返回false
        c.add("aaa");
        c.add("bbb");
        c.add("ccc");
        System.out.println(c);//[aaa, bbb, ccc]
        //3.删除元素
        c.remove("bbb");
        System.out.println(c);//[aaa, ccc]
        //4.清空元素
        //  c.clear();  System.out.println(c);//[]
        //5.判断是否包含某个元素
        //contains()方法底层依靠equals()方法进行判断，对于自定义元素类型，需要重写equals()方法
        System.out.println(c.contains("aaa"));//false
        //6.判断是否为空
        System.out.println(c.isEmpty());//true
        //7.返回集合的长度
        System.out.println(c.size());//0
        /*
        collection接口的遍历方式：
        1.迭代器遍历
        2.增强for循环遍历
        3.lambda表达式遍历
         */
        //迭代器在Java中的类是iterator,迭代器是集合的专用遍历方式，不依赖索引遍历
        System.out.println("\ncollection遍历方式：");
        System.out.println("迭代器遍历：");
        Iterator<String> it = c.iterator();//获取迭代器，指向集合0索引处
        while (it.hasNext()) {//判断是否有这个元素
            String s = it.next();//获得这个元素并移动指针到下一个元素
            /*对于collection遍历中不能用集合的方法修改集合的大小，否则会抛出ConcurrentModificationException异常
            如果真想修改，用迭代器的方法修改，不过iterator接口只提供了remove()删除方法
            if(s.equals("aaa"))   c.remove(s);
             */
            System.out.print(s + " ");//aaa ccc
        }
        /*细节注意：
        * 1.当迭代器指向空元素时，再调用next()方法会抛出NoSuchElementException异常
        * 2.遍历完毕后，指针不会重置，如果需要再次遍历，需要重新获取迭代器
        * 3.循环中只能用一次next()方法(如果一个循环多个next()方法，是不是会出现指向空元素的情况)
        * 4.迭代器遍历过程中，不能用集合的方法修改集合的大小，否则会抛出ConcurrentModificationException异常
        * */

        //增强for循环遍历(快捷方式：c.fori)
        //增强for循环遍历底层也是迭代器，但是不需要手动获取迭代器，也不需要手动判断是否有下一个元素
        //所以增强for也必须遵守迭代器的细节注意
        System.out.println("\n增强for循环遍历：");
        for (var s : c) System.out.print(s + " ");//aaa ccc

        //lambda表达式遍历(快捷方式：c.forEach)
        System.out.println("\nlambda表达式遍历：");
        c.forEach(s -> System.out.print(s + " "));//aaa ccc
        /*lambda表达式遍历底层也是迭代器，但是不需要手动获取迭代器，也不需要手动判断是否有下一个元素
        这个是lambda表达式的完整语法格式:
        c.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.print(s + " ");
            });
        */
    }
}
